/*
 * @lc app=leetcode.cn id=94 lang=cpp
 *
 * [94] 二叉树的中序遍历
 *
 * https://leetcode-cn.com/problems/binary-tree-inorder-traversal/description/
 *
 * algorithms
 * Easy (75.75%)
 * Likes:    1363
 * Dislikes: 0
 * Total Accepted:    766.2K
 * Total Submissions: 1M
 * Testcase Example:  '[1,null,2,3]'
 *
 * 给定一个二叉树的根节点 root ，返回 它的 中序 遍历 。
 * 
 * 
 * 
 * 示例 1：
 * 
 * 
 * 输入：root = [1,null,2,3]
 * 输出：[1,3,2]
 * 
 * 
 * 示例 2：
 * 
 * 
 * 输入：root = []
 * 输出：[]
 * 
 * 
 * 示例 3：
 * 
 * 
 * 输入：root = [1]
 * 输出：[1]
 * 
 * 
 * 
 * 
 * 提示：
 * 
 * 
 * 树中节点数目在范围 [0, 100] 内
 * -100 <= Node.val <= 100
 * 
 * 
 * 
 * 
 * 进阶: 递归算法很简单，你可以通过迭代算法完成吗？
 * 
 */

// @lc code=start
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    //递归遍历
    // void traversal(TreeNode* cur, vector<int>& vec){
    //     if(cur == NULL) return;
    //     traversal(cur->left, vec);
    //     vec.push_back(cur->val);
    //     traversal(cur->right, vec);
    // }
    // vector<int> inorderTraversal(TreeNode* root) {
    //     vector<int> result;
    //     traversal(root, result);
    //     return result;
    // }


    // //迭代遍历
    // vector<int> inorderTraversal(TreeNode* root) {

    //     stack<TreeNode*> st;
    //     vector<int> res;
    //     TreeNode* cur = root;
        
    //     //是或不是与
    //     //当第一次过的时候，cur非空，而st是空的
    //     //在过程中，st一直都存在，是非空
    //     // 只有最后一次，最后一个右节点 的 右孩子是NULL 而且 此时 st是空的。
    //     while (cur != NULL || !st.empty()){  
    //         if(cur != NULL){   //指针来访问节点，访问到最底层
    //             st.push(cur);  //将访问到的节点放到最低层
    //             cur = cur->left;   //左节点
    //         } else {
    //             cur = st.top(); //从栈里弹出数据，就是要处理的数据（放进result数组里的数据）
    //             st.pop();
    //             res.push_back(cur->val); //中
    //             cur = cur->right;//右
    //         }
    //     }
    //     return res; 
    // }

    // //用一个栈来表示，统一迭代法
    // vector<int> inorderTraversal(TreeNode* root) {
    //     stack<TreeNode*> st;
    //     vector<int> res;
    //     TreeNode* cur = root;
    //     if(cur == NULL) return res;
    //     st.push(cur);
    //     while(!st.empty()){
    //         TreeNode* node = st.top();
    //         if(node != NULL){
    //             st.pop();
    //             if(node->right) st.push(node->right);
    //             st.push(node);
    //             st.push(NULL);
    //             if(node->left) st.push(node->left);
    //         } else {
    //             st.pop();
    //             cur = st.top();
    //             st.pop();
    //             res.push_back(cur->val);
    //         }
    //     }
    //     return res;
    // }




};
// @lc code=end

